package main

import "fmt"

var a = 1000         //全局变量,也叫包级变量
var b int = 2000     // 显式指定类型
var b1 = int32(2000) // 显式指定类型（从声明一致性的角度考虑，推荐这种写法）

// 同一类的声明放到一个var中
var (
	name  string
	intro string
)
var (
	age   int
	score int
)

// 尽可能在靠近第一次使用变量的位置声明这个变量
var num = 100

func getData() {
	fmt.Println(num + 1)
}

// c := 3000 //语法错误
func main() {
	var num int
	num = 100
	fmt.Printf("num的数值是:%d,地址是:%p\n", num, &num)

	num = 200
	fmt.Printf("num的数值是:%d,地址是:%p\n", num, &num)
	// fmt.Println(num2) //undefined: num2

	var name string
	//name = 100
	//fmt.Println(name) //cannot use 100 (type int) as type string in assignment
	name = "张三"
	fmt.Println(name)

	var name1 string = "李四"
	fmt.Println(name1)

	num, name, sex := 1000, "王五", "男"
	fmt.Println(num, name, sex)

	fmt.Println(a)

	//变量的默认值
	var m int
	fmt.Println(m) //整数 0
	var n float64
	fmt.Println(n) //0.0
	var s string
	fmt.Println(s) //""
	var s2 []int
	fmt.Println(s2)        //切片[]
	fmt.Println(s2 == nil) //true

	//交换两个变量
	var1, var2 := 100, 200
	var1, var2 = var2, var1
	fmt.Println(var1, var2) //200 100

	/*局部变量声明*/
	//建议使用短变量声明
	a := 20
	f := 3.05
	x := "hello, nihaoya!"
	fmt.Println(a, f, x)

	//对于不接受默认类型的变量，依然可以使用短变量声明形式，只是在":="右侧要做一个显式转型，以保持声明的一致性
	a1 := int32(20)
	f1 := float32(3.05)
	x1 := []byte("hello, nihaoya!")
	fmt.Println(a1, f1, x1)

	//尽量在分支控制时使用短变量声明形式
	num = 10
	if num > 5 {
		score := 60
		fmt.Println(num + score)
	}
}
